package cn.thornbird.orgsync.model.dingtalk;

import cn.thornbird.orgsync.model.wechat.Response;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.IOException;
import java.util.Date;
import java.util.List;

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class UserList extends Response {

    @JsonProperty("result")
    private UserListResult result;


    @Data
    public static class UserListResult {

        @JsonProperty("has_more")
        private Boolean hasMore;

        @JsonProperty("next_cursor")
        private Long nextCursor;

        @JsonProperty("list")
        private List<User> list;

    }


    @Data
    public static class User {

        /**
         * 员工唯一标识ID(不可修改)
         */
        @JsonProperty("userid")
        private String userId;

        /**
         * 员工在当前开发者企业账号范围内的唯一标识
         */
        @JsonProperty("unionid")
        private String unionId;

        /**
         * 员工姓名
         */
        @JsonProperty("name")
        private String name;

        /**
         * 头像
         */
        @JsonProperty("avatar")
        private String avatar;

        /**
         * 国际电话区号
         */
        @JsonProperty("state_code")
        private String stateCode;

        /**
         * 手机号码
         */
        @JsonProperty("mobile")
        private String mobile;

        /**
         * 是否号码隐藏
         */
        @JsonProperty("hide_mobile")
        private Boolean hideMobile;

        /**
         * 电话
         */
        @JsonProperty("telephone")
        private String telephone;

        /**
         * 员工工号
         */
        @JsonProperty("job_number")
        private String jobNumber;

        /**
         * 职位
         */
        @JsonProperty("title")
        private String title;

        /**
         * 员工邮箱
         */
        @JsonProperty("email")
        private String email;

        /**
         * 员工的企业邮箱
         */
        @JsonProperty("org_email")
        private String orgEmail;

        /**
         * 办公地点
         */
        @JsonProperty("work_place")
        private String workPlace;

        /**
         * 备注
         */
        @JsonProperty("remark")
        private String remark;

        /**
         * 所属部门id列表
         */
        @JsonProperty("dept_id_list")
        private List<String> deptIdList;

        /**
         * 员工在部门中的排序
         */
        @JsonProperty("dept_order")
        private Long deptOrder;

        /**
         * 扩展属性, 最大长度2000个字符
         */
        @JsonProperty("extension")
        private String extension;

        /**
         * 入职时间, Unix时间戳, 单位毫秒
         */
        @JsonProperty("hired_date")
        @JsonDeserialize(using = TimestampDeserializer.class)
        private Date hiredDate;

        /**
         * 是否激活了钉钉
         */
        @JsonProperty("active")
        private Boolean active;

        /**
         * 是否完成了实名认证
         */
        @JsonProperty("real_authed")
        private Boolean realAuthed;

        /**
         * 是否为企业的高管
         */
        @JsonProperty("senior")
        private Boolean senior;

        /**
         * 是否为企业的管理员
         */
        @JsonProperty("admin")
        private Boolean admin;

        /**
         * 是否为企业的老板
         */
        @JsonProperty("boss")
        private Boolean boss;

        /**
         * 是否是部门的主管
         */
        @JsonProperty("leader")
        private Boolean leader;

        /**
         * 是否为企业账号
         */
        @JsonProperty("exclusive_account")
        private Boolean exclusiveAccount;

        /**
         * 员工的直属主管
         */
        @JsonProperty("manager_userid")
        private String managerUserId;

        /**
         * 员工在对应的部门中的排序
         */
        @JsonProperty("dept_order_list")
        private List<DepartmentOrder> deptOrderList;

        /**
         * 员工所在部门信息及是否是领导
         */
        @JsonProperty("leader_in_dept")
        private List<DepartmentLeader> leaderInDept;

        /**
         * 角色列表
         */
        @JsonProperty("role_list")
        private List<UserRole> roleList;

        private boolean isDetail;

    }


    @Data
    public static class DepartmentOrder {

        @JsonProperty("dept_id")
        private Long deptId;

        @JsonProperty("order")
        private Long order;

    }


    @Data
    public static class DepartmentLeader {

        @JsonProperty("dept_id")
        private Long deptId;

        @JsonProperty("leader")
        private Boolean leader;

    }


    @Data
    public static class UserRole {

        @JsonProperty("id")
        private Long id;

        @JsonProperty("name")
        private String name;

        @JsonProperty("group_name")
        private String groupName;

    }


    public static class TimestampDeserializer extends JsonDeserializer<Date> {

        @Override
        public Date deserialize(JsonParser parser, DeserializationContext context) throws IOException {
            return new Date(parser.getLongValue());
        }

    }

}
